Я использую javax.servlet.http.HttpServletRequest для реализации веб-приложения.
У меня нет проблем, чтобы получить параметр запроса с использованием метода getParameter. Однако я не знаю, как установить параметр в моем запросе.
Я использую javax.servlet.http.HttpServletRequest для реализации веб-приложения.
У меня нет проблем, чтобы получить параметр запроса с использованием метода getParameter. Однако я не знаю, как установить параметр в моем запросе.
Вы не можете, не используя стандартный API. HttpServletRequest
представляют запрос, полученный сервером, поэтому добавление новых параметров не является допустимым параметром (в отношении API).
В принципе вы могли бы реализовать подкласс HttpServletRequestWrapper
, который обертывает исходный запрос и перехватывает методы getParameter()
и передает завернутый запрос при переходе.
Если вы пройдете этот маршрут, вы должны использовать Filter
, чтобы заменить HttpServletRequest
на HttpServletRequestWrapper
:
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
if (servletRequest instanceof HttpServletRequest) {
HttpServletRequest request = (HttpServletRequest) servletRequest;
// Check wether the current request needs to be able to support the body to be read multiple times
if (MULTI_READ_HTTP_METHODS.contains(request.getMethod())) {
// Override current HttpServletRequest with custom implementation
filterChain.doFilter(new HttpServletRequestWrapper(request), servletResponse);
return;
}
}
filterChain.doFilter(servletRequest, servletResponse);
}
Если вы действительно хотите это сделать, создайте HttpServletRequestWrapper.
public class AddableHttpRequest extends HttpServletRequestWrapper {
private HashMap params = new HashMap();
public AddableingHttpRequest(HttpServletRequest request) {
super(request);
}
public String getParameter(String name) {
// if we added one, return that one
if ( params.get( name ) != null ) {
return params.get( name );
}
// otherwise return what in the original request
HttpServletRequest req = (HttpServletRequest) super.getRequest();
return validate( name, req.getParameter( name ) );
}
public void addParameter( String name, String value ) {
params.put( name, value );
}
}
Из вашего вопроса, я думаю, что вы пытаетесь сохранить что-то (объект, строку...), чтобы передать его другому сервлету, используя RequestDispatcher(). Для этого вам не нужно устанавливать параметр, но атрибут с помощью
void setAttribute(String name, Object o);
а затем
Object getAttribute(String name);
Как упоминалось в предыдущих статьях, использование HttpServletReqiestWrapper - это путь, однако пропущенная часть в этих сообщениях заключалась в том, что помимо переопределения метода getParameter(), вы также должны переопределить другие методы, связанные с параметрами, чтобы получить согласованный ответ. например, значение параметра, добавляемого пользовательской оболочкой запроса, также должно быть включено в карту параметров, возвращаемую методом getParameterMap(). Вот пример:
public class AddableHttpRequest extends HttpServletRequestWrapper {
/** A map containing additional request params this wrapper adds to the wrapped request */
private final Map<String, String> params = new HashMap<>();
/**
* Constructs a request object wrapping the given request.
* @throws java.lang.IllegalArgumentException if the request is null
*/
AddableHttpRequest(final HttpServletRequest request) {
super(request)
}
@Override
public String getParameter(final String name) {
// if we added one with the given name, return that one
if ( params.get( name ) != null ) {
return params.get( name );
} else {
// otherwise return what in the original request
return super.getParameter(name);
}
}
/**
* *** OVERRIDE THE METHODS BELOW TO REFLECT PARAMETERS ADDED BY THIS WRAPPER ****
*/
@Override
public Map<String, String> getParameterMap() {
// defaulf impl, should be overridden for an approprivate map of request params
return super.getParameterMap();
}
@Override
public Enumeration<String> getParameterNames() {
// defaulf impl, should be overridden for an approprivate map of request params names
return super.getParameterNames();
}
@Override
public String[] getParameterValues(final String name) {
// defaulf impl, should be overridden for an approprivate map of request params values
return super.getParameterValues(name);
}
}
Отсутствующее переопределение getParameterMap оказалось для меня настоящей проблемой. Итак, вот чем я закончил:
import java.util.HashMap;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
/***
* Request wrapper enabling the update of a request-parameter.
*
* @author E.K. de Lang
*
*/
final class HttpServletRequestReplaceParameterWrapper
extends HttpServletRequestWrapper
{
private final Map<String, String[]> keyValues;
@SuppressWarnings("unchecked")
HttpServletRequestReplaceParameterWrapper(HttpServletRequest request, String key, String value)
{
super(request);
keyValues = new HashMap<String, String[]>();
keyValues.putAll(request.getParameterMap());
// Can override the values in the request
keyValues.put(key, new String[] { value });
}
@SuppressWarnings("unchecked")
HttpServletRequestReplaceParameterWrapper(HttpServletRequest request, Map<String, String> additionalRequestParameters)
{
super(request);
keyValues = new HashMap<String, String[]>();
keyValues.putAll(request.getParameterMap());
for (Map.Entry<String, String> entry : additionalRequestParameters.entrySet()) {
keyValues.put(entry.getKey(), new String[] { entry.getValue() });
}
}
@Override
public String getParameter(String name)
{
if (keyValues.containsKey(name)) {
String[] strings = keyValues.get(name);
if (strings == null || strings.length == 0) {
return null;
}
else {
return strings[0];
}
}
else {
// Just in case the request has some tricks of it own.
return super.getParameter(name);
}
}
@Override
public String[] getParameterValues(String name)
{
String[] value = this.keyValues.get(name);
if (value == null) {
// Just in case the request has some tricks of it own.
return super.getParameterValues(name);
}
else {
return value;
}
}
@Override
public Map<String, String[]> getParameterMap()
{
return this.keyValues;
}
}
Извините, но почему бы не использовать следующую конструкцию:
request.getParameterMap().put(parameterName, new String[] {parameterValue});