というかJSTLにつまづき。





Map<String, Holiday>holidayMap = new HashMap<String, Holiday>;

HolidayEntity
@Entity
@Table(name = "holidays")
public class Holiday {
    @Id
    @GeneratedValue
    public Integer id;
    @Temporal(TemporalType.DATE)
    public Date date;
    public String name;
}



20087map


"21" => holiday(name"")
 

JSP
<!-- boxlen はカレンダーのセルの数です。-->
<c:forEach var="n" begin="1" end="${boxlen}">
  <!-- 日付-->
  <c:set var="day" value="${n - calendarDto.startDayOfWeek + 1}" />
  :
  <c:if test="${holidayMap[day] != null}"> <!-- まずここが無理-->
    :
  </c:if>
</c:forEach>

EL使 mapforEach
<!-- boxlen はカレンダーのセルの数です。-->
<c:forEach var="n" begin="1" end="${boxlen}">
  <!-- 日付-->
  <c:set var="day" value="${n - calendarDto.startDayOfWeek + 1}" />
  :
  <c:forEach var="hol" items="${holidayMap}">
    <c:if test="${hol.key == day}">
      <c:set var="holiday" value="${hol.value}" />
  ${f:h(holiday.name)} <!-- ここでだめ -->
    </c:if>
  </c:forEach>
</c:forEach>

Holidayentitynamename
map



"21" => holiday.name
 





やってみようpart6(JDBCRealm)

先に書いたとおり、認証はSAStrutsのサンプルでもあるとおりJ2EEコンテナにまかせることにしました。id:higayasuoさんおすすめらしいです。

テーブルの準備


DBID()ID


ididIDlogin_id

server.xmlの設定


Tomcat
server.xmlJDBCRealm

  <Realm className="org.apache.catalina.realm.JDBCRealm"
         connectionName="dbuser"
         connectionPassword="dbpass"
         connectionURL="jdbc:mysql://hostname/dbname"
         driverName="com.mysql.jdbc.Driver"
         roleNameCol="role"
         userCredCol="passwd"
         userNameCol="login_id"
         userRoleTable="roles"
         userTable="users"
  />

 org.gjt.mm.mysql.Driver jdbc.dicon

:
UserDatabaseRealm(2008.6.26)
	  <!-- コメントアウトしましょう
      <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
             resourceName="UserDatabase"/>
		-->

web.xmlの設定


SAStruts
    <security-constraint>
        <web-resource-collection>
            <web-resource-name>
            Authentication
            </web-resource-name>
            <url-pattern>/schedule/*</url-pattern>
        </web-resource-collection>
        <auth-constraint>
            <role-name>user</role-name>
            <role-name>admin</role-name>
        </auth-constraint>
    </security-constraint>
    
    <security-role>
        <role-name>user</role-name>
    </security-role>
    <security-role>
        <role-name>admin</role-name>
    </security-role>
    
    <login-config>
        <auth-method>FORM</auth-method>
        <form-login-config>
            <form-login-page>/WEB-INF/view/login/login.html</form-login-page>
            <form-error-page>/WEB-INF/view/login/loginError.html</form-error-page>
        </form-login-config>
    </login-config>














role


    <!-- NG -->
    <security-role>
        <role-name>user</role-name>
        <role-name>admin</role-name>
    </security-role>

NG




 URL

 



/manage/*admin/schedule/*admin or user




(FORM)URL
)と認証エラー時に遷移する画面( )を指定します。チュートリアルのままです。WEB-INF以下ですが、HTMLでもよいみたいです。

認証方法をBASICにしたら、そもそも認証画面とかエラー画面の指定はいらないような気がしてきた。まあいいや。

その認証画面

で指定した画面。formのaction属性とログインIDとパスワードのname属性は指定があります。

url /j_security_check
ログインIDのname属性 j_username
パスワードのname属性 j_password

以下、抜粋。

<form method="post" action="../j_security_check">
<table class="login">
<tr>
  <th>ログインID</th>
  <td><input type="text" name="j_username" value="" size="10" /></td>
</tr>
<tr>
  <th>パスワード</th>
  <td><input type="password" name="j_password" value="" size="10" /></td>
</tr>
<tr>
  <td colspan="2" style="text-align:center; padding-top:15px">
    <input type="submit" name="login" value="ログインする" />
  </td>
</tr>
</table>
</form>

認証成功



servlet API
    @Execute(validator = false)
    public String index() {
        Principal userPrincipal = request.getUserPrincipal();
        logger.debug("LoginUser is " + userPrincipal.getName());
        User user = userService.getUserDto(userPrincipal.getName());
        Beans.copy(user, userDto).execute();
        :
    }


web.xml/schedule/ index()/schedule/hogehoge()

AOP




http://d.hatena.ne.jp/ngtn/20080603/1212503018

(2008.6.26)